<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    // 1.观察者构造函数
    class Observer {
      constructor(name, fn) {
        this.name = name
        this.fn = fn || function () { }
      }
    }
    // 创建观察者（多个）
    const njzr = new Observer('年级主任', (state) => {
      console.log('因为: ' + state + ' , 你是哪个班的')
    })
    const bzr = new Observer('班主任', (state) => {
      console.log('因为: ' + state + ' , 把你爸找来')
    })
    const xz = new Observer('校长', (state) => {
      console.log('因为: ' + state + ' , 骂你的班主任')
    })

    // 2.被观察者的构造函数
    class Subject {
      constructor(state) {
        // 记录自己的状态
        this.state = state
        // 记录观察者：数组用来保存观察着我的人
        this.observsers = []
      }
      // 设置自己的状态
      setState(val) {
        this.state = val
        // 状态一经改变就需要把 我的所有观察者 的技能都触发
        this.observsers.forEach(item => {
          // 告诉他我改变成了什么状态
          item.fn(this.state)
        })
      }
      // 添加观察者
      addObserver(obs) {
        // 默认进行去重处理
        this.observsers = this.observsers.filter(item => item !== obs)
        this.observsers.push(obs)
      }
      // 删除观察者
      delObserver(obs) {
        this.observsers = this.observsers.filter(item => item !== obs)
      }
    }
    // 创造被观察者（多个）
    const xiaoming = new Subject('学习')
    xiaoming.addObserver(njzr)
    xiaoming.addObserver(bzr)
    xiaoming.addObserver(xz)

    xiaoming.setState("上课打游戏")

    const xiaohong = new Subject('学习')
    xiaohong.addObserver(bzr)
    xiaohong.addObserver(xz)

    console.log(xiaoming)
    console.log(xiaohong)
  </script>
</body>

</html>